import axios from "axios";
import type { AxiosInstance, AxiosResponse, AxiosRequestConfig } from "axios";
import type { IRequestConfig, IRequestIerface } from './type'

class Request {
  // axios 实例  同时遵循 官方实例规则
  instance: AxiosInstance
  interceptorsObj?: IRequestIerface // 可选  拦截器对象 遵循自定义请求拦截配置
  constructor(config: IRequestConfig) {
    this.instance = axios.create(config) // 配置遵循 官方请求 的配置 给到axios实例
    // 实例拦截器
    this.interceptorsObj = config.interceptors
    this.instance.interceptors.request.use(
      this.interceptorsObj?.requestIntercetor,
      this.interceptorsObj?.requestItercetorCatch
    )
    this.instance.interceptors.response.use(
      this.interceptorsObj?.responseInterceptor,
      this.interceptorsObj?.responseInterceptorCatch
    )
    // 全局拦截器
    this.instance.interceptors.request.use( // 请求拦截器
      (config: IRequestConfig) => {  // 遵循请求axios配置封装定义
        return config
      },
      (err: any) => err
    )
    // 全局响应器最后执行
    this.instance.interceptors.response.use( // 响应拦截器
      (res: AxiosResponse) => { // 遵循 响应成功的规则
        return res
      },
      (err: any) => err
    )
  }
  // 单个请求拦截器
  request(config: IRequestConfig) {
    // return this.instance.request(config)
    return new Promise((resolve, reject) => {
      if (config.interceptors?.requestIntercetor) {
        config = config.interceptors.requestIntercetor(config)
      }
      this.instance.request(config).then((res) => {
        if (config.interceptors?.responseInterceptor) {
          res = config.interceptors.responseInterceptor(res)
        }
        resolve(res)
        // return res
      }).catch((err: any) => {
        reject(err)
      })
    })
  }

}
export default Request